#include "bsp_gpio.h"
#include "app_dido.h"
#include "app_sub_can.h"

InST FB1;
InST FB2;
InST FB3;
InST FB4;
InST FB5;
InST FB6;
InST FB7;
InST FB8;
InST FB9;
InST FB10;
InST FB11;
InST FB12;
InST FB_CHG;
InST FB_ON;
InST FB_CC2;
InST FB_PW;
InST FB_BP;
InST FB_LP;

static bool GetFBState(GPIO_PortDef io, InST *arg)
{
    if (dv_DIDO.fread(io))
    {
        arg->uc_HCnt++;
        arg->uc_LCnt = 0;
        if (arg->uc_HCnt >= COUNTER_100)
        {
            arg->uc_HCnt = 0;
            arg->uc_InFlag = true;
        }
    }
    else
    {
        arg->uc_HCnt = 0;
        arg->uc_LCnt++;
        if (arg->uc_LCnt >= COUNTER_100)
        {
            arg->uc_LCnt = 0;
            arg->uc_InFlag = false;
        }
    }
    return arg->uc_InFlag;
}

void app_dido_state_init(void)
{
}

void app_dido_in_check(void)
{
    subCan.txMes1.mes.in_FB1  = GetFBState(IO_FB1, &FB1);
    subCan.txMes1.mes.in_FB2  = GetFBState(IO_FB2, &FB2);
    subCan.txMes1.mes.in_FB3  = GetFBState(IO_FB3, &FB3);
    subCan.txMes1.mes.in_FB4  = GetFBState(IO_FB4, &FB4);
    subCan.txMes1.mes.in_FB5  = GetFBState(IO_FB5, &FB5);
    subCan.txMes1.mes.in_FB6  = GetFBState(IO_FB6, &FB6);
    subCan.txMes1.mes.in_FB7  = GetFBState(IO_FB7, &FB7);
    subCan.txMes1.mes.in_FB8  = GetFBState(IO_FB8, &FB8);
    subCan.txMes1.mes.in_FB9  = GetFBState(IO_FB9, &FB9);
    subCan.txMes1.mes.in_FB10 = GetFBState(IO_FB10, &FB10);
    subCan.txMes1.mes.in_FB11 = GetFBState(IO_FB11, &FB11);
    subCan.txMes1.mes.in_FB12 = GetFBState(IO_FB12, &FB12);
    subCan.txMes1.mes.in_chg  = GetFBState(IO_FB_CHG, &FB_CHG);
    subCan.txMes1.mes.in_on   = GetFBState(IO_FB_ON, &FB_ON);
    subCan.txMes1.mes.in_cc2  = GetFBState(IO_FB_CC2, &FB_CC2);
    subCan.txMes1.mes.in_pw   = GetFBState(IO_PW, &FB_PW);
    subCan.txMes1.mes.in_bp   = GetFBState(IO_BP, &FB_BP);
    subCan.txMes1.mes.in_lp   = GetFBState(IO_LP, &FB_LP);
}

void app_dido_run(void)
{
    if(subCan.ctrl_type == EM_CTRL_TYPE_IO)
    {
        switch (subCan.io_ch)
        {
        case EM_IO_1:
            if(subCan.io_st == EM_IO_H) dv_DIDO.fwrite(IO_SW1,true);
            else if(subCan.io_st == EM_IO_L) dv_DIDO.fwrite(IO_SW1,false);			
            break;
        case EM_IO_2: 
            if(subCan.io_st == EM_IO_H) dv_DIDO.fwrite(IO_SW2,true);
            else if(subCan.io_st == EM_IO_L) dv_DIDO.fwrite(IO_SW2,false);			
            break;
        case EM_IO_3: 
            if(subCan.io_st == EM_IO_H) dv_DIDO.fwrite(IO_SW3,true);
            else if(subCan.io_st == EM_IO_L) dv_DIDO.fwrite(IO_SW3,false);
            break;
        case EM_IO_4: 
            if(subCan.io_st == EM_IO_H) dv_DIDO.fwrite(IO_SW4,true);
            else if(subCan.io_st == EM_IO_L) dv_DIDO.fwrite(IO_SW4,false);
            break;
        case EM_IO_5: 
            if(subCan.io_st == EM_IO_H) dv_DIDO.fwrite(IO_SW5,true);
            else if(subCan.io_st == EM_IO_L) dv_DIDO.fwrite(IO_SW5,false);
            break;
        case EM_IO_6: 
            if(subCan.io_st == EM_IO_H) dv_DIDO.fwrite(IO_SW6,true);
            else if(subCan.io_st == EM_IO_L) dv_DIDO.fwrite(IO_SW6,false);
            break;
        case EM_IO_7: 
            if(subCan.io_st == EM_IO_H) dv_DIDO.fwrite(IO_SW7,true);
            else if(subCan.io_st == EM_IO_L) dv_DIDO.fwrite(IO_SW7,false);
            break;
        case EM_IO_8: 
            if(subCan.io_st == EM_IO_H) dv_DIDO.fwrite(IO_SW8,true);
            else if(subCan.io_st == EM_IO_L) dv_DIDO.fwrite(IO_SW8,false);
            break;
        case EM_IO_9: 
            if(subCan.io_st == EM_IO_H) dv_DIDO.fwrite(IO_SW9,true);
            else if(subCan.io_st == EM_IO_L) dv_DIDO.fwrite(IO_SW9,false);
            break;
        case EM_IO_10: 
            if(subCan.io_st == EM_IO_H) dv_DIDO.fwrite(IO_SW10,true);
            else if(subCan.io_st == EM_IO_L) dv_DIDO.fwrite(IO_SW10,false);
            break;
        case EM_IO_11: 
            if(subCan.io_st == EM_IO_H) dv_DIDO.fwrite(IO_SW11,true);
            else if(subCan.io_st == EM_IO_L) dv_DIDO.fwrite(IO_SW11,false);
            break;
        case EM_IO_12: 
            if(subCan.io_st == EM_IO_H) dv_DIDO.fwrite(IO_SW12,true);
            else if(subCan.io_st == EM_IO_L) dv_DIDO.fwrite(IO_SW12,false);
            break;
        case EM_IO_PW: 
            if(subCan.io_st == EM_IO_H) dv_DIDO.fwrite(IO_PW,true);
            else if(subCan.io_st == EM_IO_L) dv_DIDO.fwrite(IO_PW,false);
            break;
        case EM_IO_BP: 
            if(subCan.io_st == EM_IO_H) dv_DIDO.fwrite(IO_BP,true);
            else if(subCan.io_st == EM_IO_L) dv_DIDO.fwrite(IO_BP,false);
            break;
        case EM_IO_LP: 
            if(subCan.io_st == EM_IO_H) dv_DIDO.fwrite(IO_LP,true);
            else if(subCan.io_st == EM_IO_L) dv_DIDO.fwrite(IO_LP,false);
            break;
        default:
            break;
        }
    }
}